package com.sky.controller.user;

import com.sky.constant.StatusConstant;
import com.sky.entity.Dish;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController("userDishController")
@RequestMapping("/user/dish")
@Slf4j
@Api(tags = "C端-菜品浏览接口")
public class DishController {
	@Autowired
	private DishService dishService;

	@Autowired
	private RedisTemplate redisTemplate;

	/**
	 * 根据分类id查询菜品
	 *
	 * @param categoryId
	 * @return
	 */
	@GetMapping("/list")
	@ApiOperation("根据分类id查询菜品")
	public Result<List<DishVO>> list(Long categoryId) {
		//代码改造：增加缓存功能，将查询到的菜品数据存入redis中，提高系统并发能力
		//构造redis中的key，规则："dish_"+分类id
		String key = "dish_" + categoryId;
		//查询redis中是否存在菜品数据，通过redisTemplate的opsForValue()方法，用key获取value
		List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(key);
		//如果存在，表示缓存命中，直接返回数据，不再调用服务层方法
		if (list != null && list.size() > 0) {
			//如果存在，直接返列表数据，不再调用服务层方法
			//结束该方法，走到这一步表示缓存命中，下面的代码便不会再执行
			return Result.success(list);
		}
		//如果不存在，调用服务层方法，查询菜品列表，并将结果存入redis中，返回数据
		//创建Dish对象
		Dish dish = new Dish();
		//给创建的Dish对象设置分类id
		dish.setCategoryId(categoryId);
		//给创建的Dish对象设置菜品状态为起售中，因为只允许查询起售中的菜品
		dish.setStatus(StatusConstant.ENABLE);
		//调用服务层方法，查询菜品列表
		list = dishService.listWithFlavor(dish);
		//将结果存入redis中,调用redisTemplate的opsForValue()方法，设置key和value
		//第一次查询会将结果存入redis中，第二次查询会直接从redis中获取数据
		redisTemplate.opsForValue().set(key, list);
		//返回结果
		return Result.success(list);
	}

}
